package top.jlzhou.tools;

import java.io.Serializable;
import java.util.Random;

import com.alibaba.fastjson.JSONObject;

import top.jlzhou.tools.http.Request;
import top.jlzhou.tools.http.Request.Method;

/**
 * <pre>CDKey相关生成和检测工具类</pre>
 * @ClassName	top.jlzhou.tools.CDKey
 * @author	J.L.Zhou
 * @date	2019年3月9日 下午6:51:08
 * @version 	V1.0
 * @Copyright	2019 jlzhou.top Inc. All rights reserved. 
 * 	注意：本内容仅限于公司内部传阅，禁止外泄以及用于其他的商业目
 */
public class CDKey implements Serializable {
	

	private static final long serialVersionUID = -3011829691042701181L;
	

	private CDKey(){}
	
	/**
	 * 检查本地CDKey
	 * @param tel
	 * @param cdkey
	 * @return null成功，否则错误原因
	 */
	public static String check(String tel,String cdkey,int softNum){
		String mac = null;
		try{
			mac = top.jlzhou.T.getInstance().net.getMAC();
		}catch(Exception ex){
			return "获取网卡物理地址错误："+mac;
		}
		return check(tel, cdkey, softNum, mac);
	}
	
	/**
	 * 检查CDKEY是否正确
	 * @param tel
	 * @param cdkey
	 * @param softNum
	 * @param mac
	 * @return
	 */
	public static String check(String tel,String cdkey,int softNum,String mac){
		if(cdkey==null||"".equals(cdkey.trim())){
			return "未输入CD-KEY";
		}
		if(tel==null||"".equals(tel.trim())){
			return "未输入注册电话";
		}

		
		String ms = null;
		try{
			ms = top.jlzhou.T.getInstance().codec.aes.dncode(tel, cdkey);
		}catch(Exception ex){}
		if(ms==null){
			return "手机号码不正确";
		}else if(ms.matches("^\\w\\|"+softNum+"\\|\\w\\|"+mac+"\\|\\w$")){
			return null;
		}else{
			return "CD-KEY不正确";
		}
	}

	
	/**<pre>
	 * 通过网络检查cdkey
	 * 网络请求参数
	 * 		tel=${tel}
	 * 		cdkey=${cdkey}
	 * 		mac=XXX
	 * 		softNum=${softNum}
	 * </pre>
	 * @param http	请求地址，发送方式post
	 * @param tel	注册电话
	 * @param cdkey	注册序列号
	 * @param softNum 软件编号
	 * @return null 成功，否则错误原因
	 */
	public static String check(String http,String tel,String cdkey,int softNum){
		try{
			String result = top.jlzhou.T.getInstance().getHttp().send(new Request(http)
					.setMethod(Method.GET)
					.simulationChrome()
					.addParameter("tel", tel)
					.addParameter("cdkey", cdkey)
					.addParameter("mac", getMac())
					.addParameter("softNum", ""+softNum)
					);
			JSONObject json = JSONObject.parseObject(result);
			if(json.getBoolean("ok")==true){
				return null;
			}else{
				return json.getString("message");
			}
			
		}catch(Exception ex){
			return check(tel, cdkey, softNum);
		}
	}
	
	/**
	 * 获取加密mac
	 * @return	加密mac
	 * @throws Exception 获取失败
	 */
	public static String getMac()throws Exception {
		return top.jlzhou.T.getInstance().codec.aes.encode(String.format("%08o", new Long(CDKey.serialVersionUID ^ 0xf0f0)), top.jlzhou.T.getInstance().net.getMAC());
	}
	
	/**
	 * 解密mac
	 * @param mac mac
	 * @return 解密后的mac 
	 * @throws Exception 解密异常
	 */
	public static String getMac(String mac)throws Exception {
		return top.jlzhou.T.getInstance().codec.aes.dncode(String.format("%08o", new Long(CDKey.serialVersionUID ^ 0xf0f0)), mac);
	}
	
	/**
	 * 生成序列号
	 * @param tel 电话
	 * @param softNum 产品编号
	 * @param mac 加密后的mac
	 * @return	序列号
	 * @throws Exception 异常
	 */
	public static String get(String tel,int softNum,String mac) throws Exception{
		Random r = new Random();
		return top.jlzhou.T.getInstance().codec.aes.encode(tel, String.format("%s|%d|%s|%s|%s",Integer.toString(r.nextInt(36), 36),softNum,Integer.toString(r.nextInt(36), 36),top.jlzhou.T.getInstance().codec.aes.dncode(String.format("%08o", new Long(CDKey.serialVersionUID ^ 0xf0f0)), mac), Integer.toString(r.nextInt(36), 36)));
	}
}
